const vscode = require('vscode');
const util = require('./util');
const fs = require('fs')

/**
 * 根据package.json判断当前项目的跟路径
 * 只支持mac和linux系统
 * 形如：vscode-resource:/Users/toonces/projects/vscode-cat-coding/media/cat.gif
 * @param document 
 * @param relativePath 扩展中某个文件相对于根目录的路径，如 images/test.jpg
 */
function getProjectRootPath (projectPath) {
    const pathArr = projectPath.split('/')
    pathArr.pop()
    // 然后就是一层一层往上检索，如果发现某一层的目录下含有package.json文件，就把当前的路径给返回
    let rootName = ''
    while(pathArr.length) {
        const files = fs.readdirSync(pathArr.join('/'))
        if (files.includes('package.json')) {
            rootName = pathArr.join('/')
            return rootName
        }
        pathArr.pop()
    }
    return rootName
}

/**
 * 自动提示实现，这里模拟一个很简单的操作
 * 当输入 this.dependencies.xxx时自动把package.json中的依赖带出来
 * 当然这个例子没啥实际意义，仅仅是为了演示如何实现功能
 * @param {*} document 
 * @param {*} position 
 * @param {*} token 
 * @param {*} context 
 */
function provideCompletionItems(document, position, token, context) {
    // 获取当前光标所在行数
    const line        = document.lineAt(position);
    const projectPath = util.getProjectPath(document);
    const projectRootPath = getProjectRootPath(projectPath)
    // console.log('projectRootPath:', projectRootPath);
    // 只截取到光标位置为止，防止一些特殊情况
    const lineText = line.text.substring(0, position.character);
    // 测试@/
    if(/@/.test(lineText)) {
        if (fs.readdirSync(projectRootPath).includes('src')) {
            // console.log('includes src')
            const line        = document.lineAt(position);
            let editPath    = line.text.substring(line.text.indexOf('@') + 1, position.character);
            // console.log('editPath:', editPath)
            if (editPath === '/') {
                editPath = '/src'
            } else {
                editPath = '/src' + editPath
            }
            const dependencies = fs.readdirSync(projectRootPath + editPath);
            // console.log('dependencies:', dependencies)
            return dependencies.map(dep => {
                // vscode.CompletionItemKind 表示提示的类型
                return new vscode.CompletionItem(dep, vscode.CompletionItemKind.Field);
            })
        }
    }
}

/**
 * 光标选中当前自动补全item时触发动作，一般情况下无需处理
 * @param {*} item 
 * @param {*} token 
 */
function resolveCompletionItem(item, token) {
    return null;
}

module.exports = function(context) {
    // 只对vue文件生效
    // 注册代码建议提示，只有当按下“/”时才触发
    context.subscriptions.push(vscode.languages.registerCompletionItemProvider('vue', {
        provideCompletionItems,
        resolveCompletionItem
    }, '/'));
};